﻿#pragma once
#include "zyCommandCtrol.h"
#include "zyEditBox.h"
#include "zyListBox.h"

namespace DarkMoonUI {

	class zyComboBox : public  zyCommandCtrol
	{
	public:
		zyComboBox();
		~zyComboBox();
		
		static void  WINAPI zyComboBox_Destroy(zyObject* obj);
		static LRESULT WINAPI zyComboBox_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle);
		static LRESULT  WINAPI zyComboBox_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled);
		void OnNCDestroy();
		BOOL 创建(HWND 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		BOOL 创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题 = L"", POINT 参数_位置 = POINT{ 0, 0 }, POINT 参数_尺寸 = POINT{ 60, 120 },
			int 参数_ID = 0, int 参数_窗口风格 = 0, int 参数_扩展风格 = 0);
		int 加入项目(const std::wstring& 参数_项目文本, int 参数_项目数值 = 0);
		int 插入项目(const std::wstring& 参数_项目文本, int 参数_项目索引, int 参数_项目数值);
		bool 置现行选中项(int 参数_项目索引);
		int 取现行选中项();
		bool 置最大文本长度(int 参数_最大长度);
		std::wstring 取项目文本(int 参数_项目索引);
		bool 置项目文本(int 参数_项目索引, const std::wstring& 参数_项目文本);
		bool 选中指定项(const std::wstring& 参数_项目文本, int 参数_起始位置 = -1);
		int 取项目数();
		zyEditBox* 取编辑框();
		zyListBox* 取列表框();
		int 取项目数值(int 参数_项目索引);
		bool 置项目数值(int 参数_项目索引, int 参数_数值);
		int 删除项目(int 参数_项目索引);
		bool 清空();
		bool 显示列表(bool 参数_是否显示 = true);
		int 查找(const std::wstring& 参数_欲查找文本, int 参数_起始位置 = -1);
		int 精确查找(const std::wstring& 参数_欲查找文本, int 参数_起始位置 = -1);
		RECT 取列表矩形();
		//@备注 取组合框中列表框是否可见。返回真表示可见，否则返回假。
		bool 列表是否可见() { return sendMsg(CB_GETDROPPEDSTATE, 0, 0) != 0; }
		//@备注 返回组合框中列表框的宽度(像素点)。
		int 取列表宽度() { return (int)sendMsg(CB_GETDROPPEDWIDTH, 0, 0); }
		//@备注 设置组合框中列表框的宽度(像素点)。返回现行宽度。
		int 置列表宽度(int 参数_宽度) { return (int)sendMsg(CB_SETDROPPEDWIDTH, 参数_宽度, 0); }
		//@备注 返回组合框中列表框指定项目的高度(像素点)。
		int 取项目高度(int 参数_项目索引) { return (int)sendMsg(CB_GETITEMHEIGHT, 参数_项目索引, 0); }
		bool 置项目高度(int 参数_新高度) { return sendMsg(CB_SETITEMHEIGHT, 0, 参数_新高度) != CB_ERR; }
		bool 置被选择文本(int 参数_起始位置, int 参数_结束位置);
		void 取被选择文本(int& 参数_起始位置, int& 参数_结束位置);
		//@备注 返回组合框中列表框的可见第一项项目索引。
		int 取首可视项() { return (int)sendMsg(CB_GETTOPINDEX, 0, 0); }
		//@备注 设置组合框中列表框的可见第一项。
		bool 置首可视项(int 参数_项目索引) { return sendMsg(CB_SETTOPINDEX, 参数_项目索引, 0) != CB_ERR; }
		bool 禁止F4显示列表(bool 参数_是否禁止);
		//@备注 函数 整型 OnSelChange(HWND hWnd,整型 id)
		void 事件_列表项被选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnSelChange", 参数_事件指针); }
		//@备注 函数 整型 OnEditChange(HWND hWnd,整型 id)
		void 事件_编辑内容被改变(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnEditChange", 参数_事件指针); }
		//@备注 函数 整型 OnDropDown(HWND hWnd,整型 id)
		void 事件_将弹出列表(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnDropDown", 参数_事件指针); }
		//@备注 函数 整型 OnCloseUp(HWND hWnd,整型 id)
		void 事件_列表被关闭(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnCloseUp", 参数_事件指针); }
		//@备注 函数 整型 OnDBClick(HWND hWnd,整型 id)
		void 事件_双击选择(TRegEvent* 参数_事件指针) { SetRegEvent(L"OnDBClick", 参数_事件指针); }
	};

}

